#pragma once
#include <string>
#include <unordered_map>
#include <iostream>

namespace RPC
{
    //请求正文字段宏定义;
    #define KEY_METHOD      "method"//请求方法;
    #define KEY_PARAMS      "parameters"//请求参数;
    #define KEY_TOPIC_KEY   "topic_key" //主题名称;
    #define KEY_TOPIC_MSG   "topic_msg" //主题消息;
    #define KEY_OPTYPE      "optype"//操作类型
    #define KEY_HOST        "host"//主机信息
    #define KEY_HOST_IP     "ip"//主机ip
    #define KEY_HOST_PORT   "port"//主机端口号
    #define KEY_RCODE       "rcode"//RPC响应码
    #define KEY_RESULT      "result"//响应结果


    //消息类型定义:
    //1. rpc请求和响应; 2. 主题请求和响应; 3. 服务操作请求和响应;
    enum class MType
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };

    //响应码状态定义:
    enum class RCode 
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };

    static std::string errReason(RCode code)
    {
        static std::unordered_map<RCode, std::string> err_map = 
        {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败!"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "无效消息!"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数!"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型!"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误"}
        };

        auto it = err_map.find(code);
        if(it != err_map.end())
        {
            return "未知错误";
        }
        return it->second;
    }

    //RPC请求类型定义;
    //1. 同步请求, 2. 异步请求, 3. 回调请求.
    enum class RType
    {
        REQ_SYNC = 0,//同步;
        REQ_ASYNC,//异步;
        REQ_CALLBACK//回调;
    };

    //主题类型定义;
    enum class TopicOpType
    {
        TOPIC_CREATE = 0,//主题创建
        TOPIC_REMOVE,//主题删除
        TOPIC_SUBSCRIBE,//主题订阅
        TOPIC_CANCEL,//主题取消
        TOPIC_PUBLISH//主题发布
    };

    //服务操作类型定义;
    enum class ServiceOpType
    {
        SERVICE_REGISTRY = 0,//服务注册
        SERVICE_DISCOVERY,//服务发现
        SERVICE_ONLINE,//服务上线
        SERVICE_OFFLINE,//服务下线
        SERVICE_UNKNOW//服务未知;
    };
}

